package com.example.config;

import cn.dev33.satoken.config.SaTokenConfig;
import cn.dev33.satoken.interceptor.SaInterceptor;
import cn.dev33.satoken.router.SaRouter;
import cn.dev33.satoken.stp.StpUtil;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * Sa-Token配置
 */
@Configuration
public class SaTokenConfiguration implements WebMvcConfigurer {
    
    /**
     * Sa-Token 参数配置
     */
    @Bean
    @Primary
    public SaTokenConfig getConfig() {
        SaTokenConfig config = new SaTokenConfig();
        // 使用默认token名称 (satoken)
        // config.setTokenName("Authorization");
        // token有效期 30天
        config.setTimeout(30 * 24 * 60 * 60);
        // token临时有效期 2小时
        config.setActivityTimeout(2 * 60 * 60);
        // 是否允许同一账号并发登录
        config.setIsConcurrent(true);
        // 在多人登录同一账号时，是否共用一个token
        config.setIsShare(false);
        // token风格
        config.setTokenStyle("simple-uuid");
        // 增加Sa-Token的调试日志，帮助定位问题
        config.setIsLog(true);
        // 从请求头中读取token
        config.setIsReadHeader(true);
        
        return config;
    }

    /**
     * 注册Sa-Token拦截器，打开注解式鉴权功能
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 注册路由拦截器，自定义认证规则
        registry.addInterceptor(new SaInterceptor(handler -> {
            // 登录认证：所有接口都需要登录认证
            SaRouter.match("/**")
                .notMatch(
                    "/user/login",       // 登录接口
                    "/user/register",    // 注册接口
                    "/init/data",        // 初始化数据接口
                    "/lzw/auth/captcha",
                    "/lzw/user/login",
//                    "/permission/list",
                    
                    "/lzw/login",        // 添加前端调用的登录接口
                    "/auth/captcha",     // 验证码接口
                    "/test/bcrypt",      // 测试BCrypt加密接口
                    "/reset/**",         // 密码重置工具
                    "/doc.html",         // 接口文档
                    "/swagger-ui/**",    // Swagger UI
                    "/swagger-resources/**", // Swagger 资源
                    "/v3/api-docs/**",      // OpenAPI
                    "/webjars/**",          // Swagger UI依赖
                    "/favicon.ico"          // 网站图标
                )
                .check(r -> StpUtil.checkLogin());

            // 角色认证：不同接口访问权限不同
            SaRouter.match("/employee/**", r -> StpUtil.checkPermission("employee"));
            SaRouter.match("/role/**", r -> StpUtil.checkPermission("system"));
            SaRouter.match("/dept/**", r -> StpUtil.checkPermission("system"));
//            SaRouter.match("/permission/**", r -> StpUtil.checkPermission("system"));
            
        })).addPathPatterns("/**");
    }
} 